package br.com.dispositivosmoveis.acompanhamentodeconta.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;


public class GenericsReader {
	/**
	 * Faz a leitura de um par�metro do tipo Generics.
	 * 
	 * @param clazz
	 *            Classe onde o Generics est� escrito.
	 * @param pos
	 *            �ndice que representa a posi��o do par�metro Generics. Utilize
	 *            0 para o primeiro par�metro.
	 * @return Obt�m o Class o par�metro Generics.
	 */
	public static Class<?> getTypeArgument(final Class<?> clazz, final int pos) {
		Class<?> result = null;
		final Type type = clazz.getGenericSuperclass();

		if (type instanceof ParameterizedType) {
			final ParameterizedType paramType = (ParameterizedType) type;
			result = (Class<?>) paramType.getActualTypeArguments()[pos];
		} else if (Object.class.getCanonicalName().equals(type.getClass().getCanonicalName())) {
			throw new IllegalArgumentException("Could not guess entity class by reflection");
		} else {
			result = getTypeArgument(clazz.getSuperclass(), pos);
		}

		return result;
	}
}
